Lambda
Les expressions lambda ont été introduites en Java 8 pour écrire du code plus concis et expressif. Elles permettent de définir des fonctions anonymes directement dans une méthode, ce qui est particulièrement utile pour gérer des événements ou manipuler des collections.
Syntaxe de base
Une expression lambda suit cette structure :
(paramètre) -> expression
Un paramètre — gestionnaire d'événement
Avant Java 8, brancher un bouton nécessitait une classe anonyme :
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Bouton cliqué !");
}
});
Avec une lambda, c'est la même chose en une ligne :
btn.setOnAction(event -> System.out.println("Bouton cliqué !"));
event est le paramètre reçu (le ActionEvent). La lambda remplace entièrement la classe anonyme.
Plusieurs instructions — lambda avec bloc { }
Quand la lambda fait plus d'une chose, on utilise { } et return si nécessaire :
btn.setOnAction(event -> {
label.setText("Formulaire envoyé !");
btn.setDisable(true);
});
Sans { }, Java ne peut accepter qu'une seule expression. Dès qu'on en a deux, les accolades sont obligatoires.
2. Restrictions
- Si une lambda ne contient qu’une seule instruction,
{}etreturnne sont pas nécessaires. - Si elle contient plusieurs instructions, elles doivent être encadrées par
{}, etreturnest obligatoire si une valeur doit être retournée. - Une lambda peut accéder aux variables locales de la méthode qui l’entoure, mais ces variables doivent être
finalou effectivement finales (non modifiées après leur déclaration).
String message = "Bonjour "; // effectivement final — jamais réassigné
btn.setOnAction(event -> System.out.println(message + "monde !")); // OK
String message = "Bonjour ";
message = "Salut "; // réassigné — plus effectivement final
btn.setOnAction(event -> System.out.println(message)); // ERREUR de compilation
La raison : une lambda peut s’exécuter après la fin de la méthode qui l’a créée. Si la variable pouvait changer entre-temps, la lambda lirait une valeur imprévisible.
3. Exemples d'utilisation
3.1. Utilisation avec forEach
Les expressions lambda sont aussi utiles pour parcourir une liste :
import java.util.ArrayList;
public class LambdaForEach {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
// Affichage de chaque élément
numbers.forEach(n -> System.out.println(n));
// Affichage du carré de chaque élément
numbers.forEach(n -> System.out.println(n * n));
}
}